package club.xiaojiawei.dp;

/**
 * @author 肖嘉威
 * @version 1.0
 * @date 6/5/22 5:58 PM
 * @question 198. 打家劫舍
 * @description 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 * 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
 */
public class Rob198 {

    public static void main(String[] args) {
        Rob198 test = new Rob198();
        int result = test.rob(new int[]{2,1,1,2});
        System.out.println("能偷窃的最高金额：" + result);
    }

    /**
     * dp
     * 时间复杂度 O(n)
     * 空间复杂度 O(1)
     * @param nums
     * @return
     */
    public int rob(int[] nums) {
        int steal = nums[0];
        int notSteal = 0;
        for (int i = 1; i < nums.length; i++) {
            int temp = notSteal;
//            如果不偷当前房子，则前一个房子可偷可不偷（都不会出发警报），所以直接判断是偷了钱多还是不偷钱多
            notSteal = Math.max(steal, notSteal);
//            如果偷当前房子，则前一个房子必不能偷
            steal = nums[i] + temp;
        }
        return Math.max(notSteal, steal);
    }
}
